package com.example.demo.controller.user;

import com.example.demo.commom.*;
import com.example.demo.dto.user.UserUpdateDto;
import com.example.demo.dto.user.login.ULoginDto;
import com.example.demo.dto.user.reg.URegDto;
import com.example.demo.entity.user.Parent;
import com.example.demo.service.user.AdminService;
import com.example.demo.service.user.ParentService;
import com.example.demo.service.user.StudentService;
import com.example.demo.service.user.TeacherService;
import com.example.demo.vo.user.LoginVo;
import com.example.demo.vo.user.UserInfoVo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private StudentService studentService;
    @Autowired
    private TeacherService teacherService;
    @Autowired
    private AdminService adminService;
    @Autowired
    private ParentService parentService;
    @PostMapping("/reg")
    public AjaxResult reg(@RequestBody URegDto regDto){
        // 参数校验
        String res = regDto.CheckOut();
        if(!res.isEmpty()){
            return AjaxResult.fail(res);
        }
        // 管理员
        if(regDto.getIdentity() == 0){
            return AjaxResult.success(adminService.reg(regDto));
        }
        // 教师
        if(regDto.getIdentity() == 1){
            return AjaxResult.success(teacherService.reg(regDto));
        }
        //学生
        if(regDto.getIdentity() == 2){
            return AjaxResult.success(studentService.reg(regDto));
        }
        return AjaxResult.fail(-1, "参数错误");
    }
    // 登录
    @PostMapping("/login")
    public AjaxResult login(@RequestBody ULoginDto uLoginDto){
        // 参数校验
        String res = uLoginDto.CheckOut();
        if(!res.isBlank()){
            return AjaxResult.fail(res);
        }
        // 登录
        LoginVo vo = null;
        if(uLoginDto.getIdentity() == 0){
            // 管理员
            vo = adminService.login(uLoginDto);
        } else if(uLoginDto.getIdentity() == 1){
            // 教师
            vo = teacherService.login(uLoginDto);
        } else if(uLoginDto.getIdentity() == 2){
            // 学生
            vo = studentService.login(uLoginDto);
        } else {
            // 家长
            vo = parentService.login(uLoginDto);
        }
        if(vo == null){
            return AjaxResult.fail(-1,"登录失败");
        }
        if(vo.getCode() == 0){
            return AjaxResult.success(vo.getMsg());
        } else {
            return AjaxResult.fail(vo.getCode(), vo.getMsg());
        }
    }


    @PostMapping("/logout")
    public AjaxResult logout(HttpServletRequest request) {
        String token = request.getHeader("token");
        return AjaxResult.success(TokenUtil.deleteToken(token));
    }

    /**
     * 管理员：
     * 1. 查看指定/全部管理员信息
     * 2. 查看指定/全部教师信息
     * 3. 查看学生信息：
     * - 查看指定学生
     * - 查看指定班级
     * - 查看指定专业
     * 教师：
     * 1. 查看指定/全部教师信息
     * 2. 查看学生信息：
     * - 查看指定学生
     * - 查看指定班级
     * - 查看指定专业
     * 学生：
     * 1. 查看自己的信息
     * 家长：
     * 1. 查看自己的信息
     * 2. 查看自己的孩子的信息
     * 备注：
     * 查看自己的信息由token就行
     * @param request
     * @param identity
     * @return
     */
    @GetMapping("/userinfo")
    public AjaxResult getUserById(
            HttpServletRequest request,
            Integer identity,
            Integer class_id,
            String major,
            Integer student_id,
            Integer admin_id,
            Integer teacher_id
    ) {
        String token = request.getHeader("token");
        Integer user_id = TokenUtil.getIdByToken(token);
        if(user_id == null || user_id <= 0 || user_id > 100000){
            return AjaxResult.fail(-1,"token不存在");
        }
        // 根据不同身份
        if(identity == 0){
            // 管理员
            if(!adminService.authentication(user_id)){
                return AjaxResult.fail("管理员身份有误");
            }
            if(admin_id != null){
                // 查看指定 / 所有管理员信息
                return AjaxResult.success(adminService.getAdminInfo(admin_id));
            } else if(teacher_id != null){
                // 查看指定 / 所有教师信息
                return AjaxResult.success(teacherService.getTeacherInfo(teacher_id));
            } else if(student_id != null){
                // 查看所有学生信息  0表示查看全部学生，1表示根据班级查看，2表示根据专业查看，其他值表示查看指定用户信息
                if(student_id == 1 && (class_id == null || class_id <= 0)){
                    return AjaxResult.fail("参数有误");
                }
                if(student_id == 2 && !StringUtils.hasLength(major)){
                    return AjaxResult.fail("参数有误");
                }
                return AjaxResult.success(studentService.getStudentInfo(student_id, class_id, major));
            } else {
                return AjaxResult.success(adminService.getAdminInfo(user_id));
            }
        } else if(identity == 1){
            //教师
            if(!teacherService.authentication(user_id)) {
                return AjaxResult.fail("教师身份有误");
            }
            // 根据传参不同，查询
            if(teacher_id != null){
                // 查看指定 / 所有教师信息
                return AjaxResult.success(teacherService.getTeacherInfo(teacher_id));
            } else if(student_id != null){
                // 查看所有学生信息  0表示查看全部学生，1表示根据班级查看，2表示根据专业查看，其他值表示查看指定用户信息
                if(student_id == 1 && (class_id == null || class_id <= 0)){
                    return AjaxResult.fail("参数有误");
                }
                if(student_id == 2 && !StringUtils.hasLength(major)){
                    return AjaxResult.fail("参数有误");
                }
                return AjaxResult.success(studentService.getStudentInfo(student_id, class_id, major));
            } else {
                return AjaxResult.success(teacherService.getTeacherInfo(user_id));
            }
        } else if(identity == 2){
            // 学生 - 只能查看自己的信息
            if(!studentService.authentication(user_id)){
                return AjaxResult.fail("学生身份有误");
            }
            return AjaxResult.success(studentService.getStudentInfo(user_id,null,null));
        } else if(identity == 3){
            // 家长
            if(!parentService.authentication(user_id)){
                return AjaxResult.fail("家长身份有误");
            }
            // 查看自己的信息
            List<UserInfoVo> infoVos = parentService.getParentById(user_id);
            // 先把家长信息查询出来，在根据是否有student_id来看返回什么值
            if(student_id == null){
                return AjaxResult.success(infoVos);
            } else if(student_id == 0){
                // 查询名下所有学生信息
                String student_array = infoVos.get(0).getStudent_array();
                String[] student_ids = student_array.split(",");
                List<UserInfoVo> student_infos = new ArrayList<>();
                for(String id : student_ids){
                    List<UserInfoVo> tmp = studentService.getStudentInfo(Integer.valueOf(id),null,null);
                    student_infos.addAll(tmp);
                }
                return AjaxResult.success(student_infos);
            } else {
                // 查询指定学生信息
                // 验证该学生是不是属于该家长名下
                String student_array = infoVos.get(0).getStudent_array();
                String[] student_ids = student_array.split(",");
                for(String id : student_ids){
                    if(Integer.valueOf(id).equals(student_id)){
                        return AjaxResult.success(studentService.getStudentInfo(student_id,null,null));
                    }
                }
                return AjaxResult.success(null);
            }
        }
        return AjaxResult.fail(-1, "参数错误");
    }

    //修改个人信息 - 专业班级学号等不得由学生自己删除
    @PostMapping("/update")
    public AjaxResult updateStudentInfo(@RequestBody UserUpdateDto userUpdateDto, HttpServletRequest request) {
        //获取当前用户信息
        String token = request.getHeader("token");
        Integer userId = TokenUtil.getIdByToken(token);
        if(userId == null ||userId < 10000){
            return AjaxResult.fail("token有误 或 身份不支持当前功能");
        }
        // 学生
        return AjaxResult.success(studentService.updateStudentInfo(userUpdateDto, userId));
    }

}
